summaryrefslogtreecommitdiff
path: root/app/[lng]/evcp/(evcp)/(eng)/swp-document-upload/swp-document-page.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'app/[lng]/evcp/(evcp)/(eng)/swp-document-upload/swp-document-page.tsx')
-rw-r--r--app/[lng]/evcp/(evcp)/(eng)/swp-document-upload/swp-document-page.tsx231
1 files changed, 0 insertions, 231 deletions
diff --git a/app/[lng]/evcp/(evcp)/(eng)/swp-document-upload/swp-document-page.tsx b/app/[lng]/evcp/(evcp)/(eng)/swp-document-upload/swp-document-page.tsx
deleted file mode 100644
index eedb68e2..00000000
--- a/app/[lng]/evcp/(evcp)/(eng)/swp-document-upload/swp-document-page.tsx
+++ /dev/null
@@ -1,231 +0,0 @@
-"use client";
-
-import { useState, useEffect, useTransition } from "react";
-import { useRouter, useSearchParams } from "next/navigation";
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
-import { Alert, AlertDescription } from "@/components/ui/alert";
-import { Skeleton } from "@/components/ui/skeleton";
-import { InfoIcon } from "lucide-react";
-import { SwpTable } from "@/lib/swp/table/swp-table";
-import { SwpTableToolbar } from "@/lib/swp/table/swp-table-toolbar";
-import {
- fetchSwpDocuments,
- fetchProjectList,
- fetchSwpStats,
- type SwpTableFilters,
- type SwpDocumentWithStats,
-} from "@/lib/swp/actions";
-
-interface SwpDocumentPageProps {
- searchParams: { [key: string]: string | string[] | undefined };
-}
-
-export default function SwpDocumentPage({ searchParams }: SwpDocumentPageProps) {
- const router = useRouter();
- const params = useSearchParams();
- const [isPending, startTransition] = useTransition();
-
- // URL에서 필터 파라미터 추출
- const initialFilters: SwpTableFilters = {
- projNo: (searchParams.projNo as string) || "",
- docNo: (searchParams.docNo as string) || "",
- docTitle: (searchParams.docTitle as string) || "",
- pkgNo: (searchParams.pkgNo as string) || "",
- vndrCd: (searchParams.vndrCd as string) || "",
- stage: (searchParams.stage as string) || "",
- };
-
- const initialPage = parseInt((searchParams.page as string) || "1", 10);
- const initialPageSize = parseInt((searchParams.pageSize as string) || "100", 10);
-
- // 상태 관리
- const [documents, setDocuments] = useState<SwpDocumentWithStats[]>([]);
- const [total, setTotal] = useState(0);
- const [page, setPage] = useState(initialPage);
- const [pageSize] = useState(initialPageSize);
- const [totalPages, setTotalPages] = useState(0);
- const [filters, setFilters] = useState<SwpTableFilters>(initialFilters);
- const [projects, setProjects] = useState<Array<{ PROJ_NO: string; PROJ_NM: string }>>([]);
- const [stats, setStats] = useState({
- total_documents: 0,
- total_revisions: 0,
- total_files: 0,
- last_sync: null as Date | null,
- });
- const [isLoading, setIsLoading] = useState(true);
- const [error, setError] = useState<string | null>(null);
-
- // 초기 데이터 로드
- useEffect(() => {
- loadInitialData();
- }, []);
-
- // 필터 변경 시 데이터 재로드
- useEffect(() => {
- if (!isLoading) {
- loadDocuments();
- }
- }, [filters, page]);
-
- const loadInitialData = async () => {
- try {
- setIsLoading(true);
- setError(null);
-
- // 병렬로 데이터 로드
- const [projectsData, statsData, documentsData] = await Promise.all([
- fetchProjectList(),
- fetchSwpStats(),
- fetchSwpDocuments({
- page,
- pageSize,
- filters: Object.keys(initialFilters).length > 0 ? initialFilters : undefined,
- }),
- ]);
-
- setProjects(projectsData);
- setStats(statsData);
- setDocuments(documentsData.data);
- setTotal(documentsData.total);
- setTotalPages(documentsData.totalPages);
- } catch (err) {
- console.error("초기 데이터 로드 실패:", err);
- setError(err instanceof Error ? err.message : "데이터 로드 실패");
- } finally {
- setIsLoading(false);
- }
- };
-
- const loadDocuments = async () => {
- startTransition(async () => {
- try {
- const data = await fetchSwpDocuments({
- page,
- pageSize,
- filters: Object.keys(filters).some((key) => filters[key as keyof SwpTableFilters])
- ? filters
- : undefined,
- });
-
- setDocuments(data.data);
- setTotal(data.total);
- setTotalPages(data.totalPages);
-
- // URL 업데이트
- const params = new URLSearchParams();
- if (filters.projNo) params.set("projNo", filters.projNo);
- if (filters.docNo) params.set("docNo", filters.docNo);
- if (filters.docTitle) params.set("docTitle", filters.docTitle);
- if (filters.pkgNo) params.set("pkgNo", filters.pkgNo);
- if (filters.vndrCd) params.set("vndrCd", filters.vndrCd);
- if (filters.stage) params.set("stage", filters.stage);
- if (page !== 1) params.set("page", page.toString());
-
- router.push(`?${params.toString()}`, { scroll: false });
- } catch (err) {
- console.error("문서 로드 실패:", err);
- setError(err instanceof Error ? err.message : "문서 로드 실패");
- }
- });
- };
-
- const handleFiltersChange = (newFilters: SwpTableFilters) => {
- setFilters(newFilters);
- setPage(1); // 필터 변경 시 첫 페이지로
- };
-
- const handlePageChange = (newPage: number) => {
- setPage(newPage);
- };
-
- if (isLoading) {
- return (
- <Card>
- <CardHeader>
- <Skeleton className="h-8 w-48" />
- <Skeleton className="h-4 w-96" />
- </CardHeader>
- <CardContent className="space-y-4">
- <Skeleton className="h-32 w-full" />
- <Skeleton className="h-96 w-full" />
- </CardContent>
- </Card>
- );
- }
-
- if (error) {
- return (
- <Alert variant="destructive">
- <AlertDescription>{error}</AlertDescription>
- </Alert>
- );
- }
-
- return (
- <div className="space-y-6">
- {/* 통계 카드 */}
- <div className="grid grid-cols-1 md:grid-cols-4 gap-4">
- <Card>
- <CardHeader className="pb-3">
- <CardDescription>총 문서</CardDescription>
- <CardTitle className="text-3xl">{stats.total_documents.toLocaleString()}</CardTitle>
- </CardHeader>
- </Card>
- <Card>
- <CardHeader className="pb-3">
- <CardDescription>총 리비전</CardDescription>
- <CardTitle className="text-3xl">{stats.total_revisions.toLocaleString()}</CardTitle>
- </CardHeader>
- </Card>
- <Card>
- <CardHeader className="pb-3">
- <CardDescription>총 파일</CardDescription>
- <CardTitle className="text-3xl">{stats.total_files.toLocaleString()}</CardTitle>
- </CardHeader>
- </Card>
- <Card>
- <CardHeader className="pb-3">
- <CardDescription>마지막 동기화</CardDescription>
- <CardTitle className="text-lg">
- {stats.last_sync
- ? new Date(stats.last_sync).toLocaleDateString("ko-KR")
- : "없음"}
- </CardTitle>
- </CardHeader>
- </Card>
- </div>
-
- {/* 안내 메시지 */}
- {documents.length === 0 && !filters.projNo && (
- <Alert>
- <InfoIcon className="h-4 w-4" />
- <AlertDescription>
- 시작하려면 프로젝트를 선택하고 <strong>SWP 동기화</strong> 버튼을 클릭하세요.
- </AlertDescription>
- </Alert>
- )}
-
- {/* 메인 테이블 */}
- <Card>
- <CardHeader>
- <SwpTableToolbar
- filters={filters}
- onFiltersChange={handleFiltersChange}
- projects={projects}
- />
- </CardHeader>
- <CardContent>
- <SwpTable
- initialData={documents}
- total={total}
- page={page}
- pageSize={pageSize}
- totalPages={totalPages}
- onPageChange={handlePageChange}
- />
- </CardContent>
- </Card>
- </div>
- );
-}
-